package com.hongyun.tms.common.utils;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hongyun.tms.common.enums.BizCode;
import com.hongyun.tms.exception.BusinessRuntimeException;

import java.util.List;
import java.util.function.Function;

/**
 * 删除前的引用校验 工具类
 *
 * @author liPeng
 * @date 2024-08-01
 */
public class ReferenceCheckUtil {

    /**
     * 删除前的引用校验，如果被引用了则throw
     *
     * @param service         检查的服务类
     * @param column          检查的列
     * @param ids             ID列表
     * @param <T>             服务类的类型
     * @param menu            被哪里引用
     * @param getNameFunction 获取名称的函数
     */
    public static <T, E> void checkReference(IService<T> service, SFunction<T, ?> column, List<String> ids, String menu, Function<E, String> getNameFunction, Function<String, E> getEntityFunction) {
        long count = service.count(new LambdaQueryWrapper<T>().in(column, ids));
        if (count > 0) {
            E entity = getEntityFunction.apply(ids.get(0)); // 获取第一个引用的实体
            throw new BusinessRuntimeException(BizCode.DELETE_FAILED, getNameFunction.apply(entity) + "被" + menu + "引用，无法删除");
        }
    }
}
